Loading required package: spam
Loading required package: dotCall64
Loading required package: grid
Spam version 2.7-0 (2021-06-25) is loaded.
Type 'help( Spam)' or 'demo( spam)' for a short introduction
and overview of this package.
Help for individual functions is also obtained by adding the
suffix '.spam' to the function name, e.g. 'help( chol.spam)'.
Attaching package: ‘spam’
The following objects are masked from ‘package:base’:
backsolve, forwardsolve
Loading required package: viridis
Loading required package: viridisLite
See https://github.com/NCAR/Fields for
an extensive vignette, other supplements and source code
Loading required package: lhs
Loading required package: parallel
Loading required package: viztools
Loading required package: usethis
[1] “baresoilFrac_lnd_mean_ens_ssp585_S3” “c3PftFrac_lnd_mean_ens_ssp585_S3” “c4PftFrac_lnd_mean_ens_ssp585_S3”
[4] “cSoil_ens_ssp585_S3” “cVeg_ens_ssp585_S3” “fHarvest_lnd_sum_ens_ssp585_S3”
[7] “fLuc_lnd_sum_ens_ssp585_S3” “lai_lnd_mean_ens_ssp585_S3” “nbp_ens_ssp585_S3”
[10] “npp_ens_ssp585_S3” “rh_lnd_sum_ens_ssp585_S3” “shrubFrac_lnd_mean_ens_ssp585_S3”
[13] “treeFrac_lnd_mean_ens_ssp585_S3”


Which ensemble members match constraints?
Start with Level 2 (Andy’s constraints in NPP, NBP, cSoil and cVeg)
Timeseries of absolute vales

Anomaly timeseries

Include baresoil fraction data

Anomaly timeseries AW + baresoil

End-Of-Century values under various constraints
Starting with AW constraints (level 2) and then bare soil (level3)
Histograms of end-of-century absolute values


Histograms of end-of-century changes (anomaly from preindustrial)


Adding cumulative NBP as a constraint
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[,1] [,2] [,3]
[1,] 1 3 6
[2,] 4 9 15
[3,] 7 15 24


[1] 37
[1] 12.8
[1] 6
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgSlVMRVMxcDAgZW5zZW1ibGUgU1NQNTg1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CiMgTG9hZCBoZWxwZXIgZnVuY3Rpb25zCgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnBhdGggPSAiZmlncy8iLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZ3MgPSBGQUxTRSkKCgpgYGAKCmBgYHtyfQoKc291cmNlKCJKVUxFUy1FUy0xcDAtY29tbW9uLXBhY2thZ2VzLlIiKQpzb3VyY2UoIkpVTEVTLUVTLTFwMC1jb21tb24tZnVuY3Rpb25zLlIiKQpgYGAKCgpgYGB7cn0KCmxpbmVQbG90TXVsdGlFbnMgPC0gZnVuY3Rpb24oeWVhcnMsIGVuczEsIGVuczIsIGNvbDEsIGNvbDIsIHlsYWIsIG1haW4sIHlsaW0gPSBOVUxMKXsKICAjIFBsb3Qgd2F2ZTAwIGFuZCB3YXZlMDEgdGltZXNlcmllcyBvbiB0b3Agb2Ygb25lIGFub3RoZXIKICAKICBudCA8LSBsZW5ndGgoeWVhcnMpIAogIGlmKGlzLm51bGwoeWxpbSkpewogICAgCiAgI3lsaW0gPSByYW5nZShjKGVuczFbLDFdLCBlbnMxWyxudF0sIGVuczJbLDFdLCBlbnMyWyAsbnRdKSkKICB5bGltID0gcmFuZ2UoYyhlbnMxLGVuczIpKQogIH0KICAKICBlbHNlIHlsaW0gPC0geWxpbQogIAogIG1hdHBsb3QoeWVhcnMsIHQoZW5zMSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IGNvbDEsCiAgICAgICAgeWxhYiA9IHlsYWIsIG1haW4gPSBtYWluLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nLCBsd2QgPSAxLjUpCiAgbWF0bGluZXMoeWVhcnMsIHQoZW5zMiksIGNvbCA9IGNvbDIsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSkKfQoKCm1ha2VUaW1lc2VyaWVzRW5zZW1ibGVTU1AgPC0gZnVuY3Rpb24oZW5zbG9jLCB2YXJpYWJsZSwgbnN0YXJ0LCBuZW5kLCBjbiA9IDE4NTA6MjEwMCl7CiAgCiAgeXNlYyA8LSAzMTUzNjAwMAogIAogIG5lbnMgPC0gKG5lbmQgLSBuc3RhcnQpICsgMQogICMgbmVucyBpcyBudW1iZXIgb2YgZW5zZW1ibGUgbWVtYmVycwogICMgbnRzIGxlbmd0aCBvZiB0aW1lc2VyaWVzCiAgIyBjbiBpcyBjb2xuYW1lcygpCiAgZGF0bWF0IDwtIG1hdHJpeChOQSwgbnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgoY24pKQogIGNvbG5hbWVzKGRhdG1hdCkgPC0gY24KICAKICBlbnNsaXN0IDwtIHBhc3RlKCJQIiwgZm9ybWF0Qyhuc3RhcnQ6bmVuZCwgd2lkdGg9NCwgZmxhZz0iMCIpLCBzZXA9IiIpCiAgCiAgZm9yKGkgaW4gMTpuZW5zKXsKICAgIAogICAgZW5zbWVtYmVyIDwtIGVuc2xpc3RbaV0KICAgIAogICAgZm4gPC0gcGFzdGUwKGVuc2xvYywnSlVMRVMtRVMtMXAwXycsZW5zbWVtYmVyLCdfQW5udWFsX2dsb2JhbC5uYycpCiAgICAKICAgIHRyeShuYyA8LSBuY19vcGVuKHBhc3RlMChmbikpKQogICAgI3RyeShsb2NhbHRpbWUgPC0gbmN2YXJfZ2V0KG5jLCAndGltZScpKQogICAgCiAgICAjIFRoaXMgcGFydCBjb21wZW5zYXRlcyBmb3IgdGhlIGZhY3QgdGhhdCBzb21ldGltZXMgeWVhcnMgYXJlIG1pc3NpbmcKICAgICN0cnkobG9jYWx5ZWFyIDwtIGZsb29yKDIxMDAgKyAobG9jYWx0aW1lIC8geXNlYykpKQogICAgI3RyeShpeCA8LSB3aGljaChjbiVpbiVsb2NhbHllYXIpKQogICAgCiAgICB0cnkoZGF0IDwtIGV4dHJhY3RUaW1lc2VyaWVzKG5jLCB2YXJpYWJsZSkpCiAgICAKICAgIHRyeShkYXRtYXRbaSwgXSA8LSBkYXQpCiAgICBuY19jbG9zZShuYykKICB9CiAgZGF0bWF0Cn0KCmdldFN0YW5kYXJkTWVtYmVyU1NQIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFyaWFibGUsIG50cyA9IDI1MSwgY24gPSAxODUwOjIxMDApewogIAogIGRhdG1hdCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxLCBuY29sID0gbnRzKQogIGNvbG5hbWVzKGRhdG1hdCkgPC0gY24KICAKICBlbnNtZW1iZXIgPC0gJ1MzJwogICNmbiA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlciwnL3N0YXRzLycsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQogIGZuIDwtIHBhc3RlMChlbnNsb2MsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQogIAogIHRyeShuYyA8LSBuY19vcGVuKHBhc3RlMChmbikpKQogIHRyeShkYXQgPC0gZXh0cmFjdFRpbWVzZXJpZXMobmMsIHZhcmlhYmxlKSkKICAKICBkYXRtYXRbMSwgXSA8LSBkYXQKICBuY19jbG9zZShuYykKICBkYXRtYXQKICAKfQoKCgpgYGAKCgoKYGBge3J9CgoKZW5zbG9jX3NzcDU4NV9TMyA8LSAnL2RhdGEvdXNlcnMvaGFkYXcvSlVMRVNfRVNfUFBFL3UtY2Y5MzIvJwplbnNsb2Nfc3NwNTg1X1JBRCA8LSAnL2RhdGEvdXNlcnMvaGFkYXcvSlVMRVNfRVNfUFBFL3UtY2s2NDcvJwoKeXNlYyA9IDYwKjYwKjI0KjM2NQpzc3B5ZWFycyA8LSAxODUwOjIxMDAKCgoKYGBgCgoKYGBge3J9CnlfbmFtZXNfc2VsZWN0X3NzcDU4NSA8LSAgYygibnBwIiwgIm5icCIsICJjU29pbCIsICJjVmVnIiwKICAgICAgICAgICAgICAgICAgICAgImxhaV9sbmRfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICJyaF9sbmRfc3VtIiAsICJmTHVjX2xuZF9zdW0iLCAiZkhhcnZlc3RfbG5kX3N1bSIsICAKICAgICAgICAgICAgICAgICAgICAgInRyZWVGcmFjX2xuZF9tZWFuIiAsICJiYXJlc29pbEZyYWNfbG5kX21lYW4iLAogICAgICAgICAgICAgICAgICAgICAic2hydWJGcmFjX2xuZF9tZWFuIiwgImMzUGZ0RnJhY19sbmRfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICJjNFBmdEZyYWNfbG5kX21lYW4iICAgCikKCnNlbGVjdF91bml0cyA8LSBjKCdHdEMveWVhcicsICdHdEMveWVhcicsICdHdEMnLCAnR3RDJywgJ2luZGV4JywgJ0d0Qy95ZWFyJywnR3RDL3llYXInLCAnR3RDL3llYXInLCAnJScsICclJywgJyUnLCAnJScsICclJykKbmFtZXMoc2VsZWN0X3VuaXRzKSA8LSB5X25hbWVzX3NlbGVjdF9zc3A1ODUKCiMgSGlzdG9ncmFtcyBvZiBlbmQgb2YgY2VudHVyeSB2YWx1ZXMKeXZlY19zc3A1ODUgPC0gcGFzdGUwKHlfbmFtZXNfc2VsZWN0X3NzcDU4NSwgIl9lbnNfc3NwNTg1X1MzIikKCnl2ZWNfYW5vbV9zc3A1ODUgPC0gcGFzdGUwKHlfbmFtZXNfc2VsZWN0X3NzcDU4NSwgIl9lbnNfYW5vbV9zc3A1ODVfUzMiKQoKYGBgCgpbMV0gImJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzIiAiYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMiICAgICJjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyIgICAKIFs0XSAiY1NvaWxfZW5zX3NzcDU4NV9TMyIgICAgICAgICAgICAgICAgICJjVmVnX2Vuc19zc3A1ODVfUzMiICAgICAgICAgICAgICAgICAgImZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3NzcDU4NV9TMyIgICAgIAogWzddICJmTHVjX2xuZF9zdW1fZW5zX3NzcDU4NV9TMyIgICAgICAgICAgImxhaV9sbmRfbWVhbl9lbnNfc3NwNTg1X1MzIiAgICAgICAgICAibmJwX2Vuc19zc3A1ODVfUzMiICAgICAgICAgICAgICAgICAgClsxMF0gIm5wcF9lbnNfc3NwNTg1X1MzIiAgICAgICAgICAgICAgICAgICAicmhfbG5kX3N1bV9lbnNfc3NwNTg1X1MzIiAgICAgICAgICAgICJzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyIgICAKWzEzXSAidHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyIgCgoKCmBgYHtyfQoKaWYgKGZpbGUuZXhpc3RzKCJlbnNlbWJsZV90aW1lc2VyaWVzX3NzcF8yMDIyLTA4LTA5LnJkYXRhIikpIHsKICBsb2FkKCJlbnNlbWJsZV90aW1lc2VyaWVzX3NzcF8yMDIyLTA4LTA5LnJkYXRhIikKfSBlbHNlIHsKICAKICAjIHByaW1hcnkgY2FyYm9uIGN5Y2xlIG91dHB1dHMKICBucHBfZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gIm5wcF9ubGltX2xuZF9zdW0iLCBjbiA9IHNzcHllYXJzKSAvICgxZTEyL3lzZWMpCiAgCiAgbmJwX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJuYnBfbG5kX3N1bSIsIGNuID0gc3NweWVhcnMpIC8gKDFlMTIveXNlYykKICAKICBjU29pbF9lbnNfc3NwNTg1X1MzIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGVTU1AoZW5zbG9jID0gZW5zbG9jX3NzcDU4NV9TMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zdGFydCA9IDQ5OSwgbmVuZCA9IDk5OSwgdmFyaWFibGUgPSAiY1NvaWxfbG5kX3N1bSIsIGNuID0gc3NweWVhcnMpIC8gMWUxMgogIAogIGNWZWdfZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gImNWZWdfbG5kX3N1bSIsIGNuID0gc3NweWVhcnMpIC8gMWUxMgogIAogIGxhaV9sbmRfbWVhbl9lbnNfc3NwNTg1X1MzIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGVTU1AoZW5zbG9jID0gZW5zbG9jX3NzcDU4NV9TMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zdGFydCA9IDQ5OSwgbmVuZCA9IDk5OSwgdmFyaWFibGUgPSAibGFpX2xuZF9tZWFuIiwgY24gPSBzc3B5ZWFycykKICAKICAjIGZsdXhlcwogIHJoX2xuZF9zdW1fZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gInJoX2xuZF9zdW0iLCBjbiA9IHNzcHllYXJzKSAvICgxZTEyL3lzZWMpCiAgCiAgZkx1Y19sbmRfc3VtX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJmTHVjX2xuZF9zdW0iLCBjbiA9IHNzcHllYXJzKSAvICgxZTEyL3lzZWMpCiAKICBmSGFydmVzdF9sbmRfc3VtX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJmSGFydmVzdF9sbmRfc3VtIiwgY24gPSBzc3B5ZWFycykgLyAoMWUxMi95c2VjKQogIAogICMgZnJhY3Rpb25zCiAgdHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gInRyZWVGcmFjX2xuZF9tZWFuIiwgY24gPSBzc3B5ZWFycykKCiAgc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJzaHJ1YkZyYWNfbG5kX21lYW4iLCBjbiA9IHNzcHllYXJzKSAgCiAgCiAgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJiYXJlc29pbEZyYWNfbG5kX21lYW4iLCBjbiA9IHNzcHllYXJzKSAgCiAgCiAgYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJjM1BmdEZyYWNfbG5kX21lYW4iLCBjbiA9IHNzcHllYXJzKSAKICAKICBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gImM0UGZ0RnJhY19sbmRfbWVhbiIsIGNuID0gc3NweWVhcnMpICAgCiAgCiAgc2F2ZShucHBfZW5zX3NzcDU4NV9TMywgbmJwX2Vuc19zc3A1ODVfUzMsIGNTb2lsX2Vuc19zc3A1ODVfUzMsIGNWZWdfZW5zX3NzcDU4NV9TMywgbGFpX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIHJoX2xuZF9zdW1fZW5zX3NzcDU4NV9TMywgZkx1Y19sbmRfc3VtX2Vuc19zc3A1ODVfUzMsIGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3NzcDU4NV9TMywKICAgICAgIHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIHNocnViRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzLCBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyxjM1BmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsCiAgICAgICBmaWxlID0gImVuc2VtYmxlX3RpbWVzZXJpZXNfc3NwXzIwMjItMDgtMDkucmRhdGEiICkKICAKfQoKCmBgYAoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKIyBucHBfc3Rhbl9zc3A1ODVfUzM8LSBnZXRTdGFuZGFyZE1lbWJlcihlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAwLCB2YXJpYWJsZSA9ICJucHBfbmxpbV9sbmRfc3VtIikgLyAoMWUxMi95c2VjKQojIG5icF9zdGFuX3NzcDU4NV9TMyA8LSBnZXRTdGFuZGFyZE1lbWJlcihlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAwLCB2YXJpYWJsZSA9ICJuYnBfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKIyBjU29pbF9zdGFuX3NzcDU4NV9TMyA8LSBnZXRTdGFuZGFyZE1lbWJlcihlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAwLCB2YXJpYWJsZSA9ICJjU29pbF9sbmRfc3VtIikgLyAxZTEyCiMgY1ZlZ19zdGFuX3NzcDU4NV9TMyA8LSBnZXRTdGFuZGFyZE1lbWJlcihlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAwLCB2YXJpYWJsZSA9ICJjVmVnX2xuZF9zdW0iKSAvIDFlMTIKIyBsYWlfbG5kX21lYW5fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAibGFpX2xuZF9tZWFuIikKIyAKIyAKIyAjIGZsdXhlcwojIHJoX2xuZF9zdW1fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAicmhfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKIyBmTHVjX2xuZF9zdW1fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiZkx1Y19sbmRfc3VtIikgLyAoMWUxMi95c2VjKQojIGZIYXJ2ZXN0X2xuZF9zdW1fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiZkhhcnZlc3RfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKIyAKIyAKIyAjIGZyYWN0aW9ucwojIHRyZWVGcmFjX2xuZF9tZWFuX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gInRyZWVGcmFjX2xuZF9tZWFuIikKIyBzaHJ1YkZyYWNfbG5kX21lYW5fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAic2hydWJGcmFjX2xuZF9tZWFuIikKIyBiYXJlc29pbEZyYWNfbG5kX21lYW5fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiYmFyZXNvaWxGcmFjX2xuZF9tZWFuIikKIyBjM1BmdEZyYWNfbG5kX21lYW5fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiYzNQZnRGcmFjX2xuZF9tZWFuIikKIyBjNFBmdEZyYWNfbG5kX21lYW5fc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiYzRQZnRGcmFjX2xuZF9tZWFuIikKCgoKYGBgCgoKYGBge3J9CiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyMgQW5vbWFsaXplIGVuc2VtYmxlCiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm5wcF9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgobnBwX2Vuc19zc3A1ODVfUzMsIDE6MjApCm5icF9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgobmJwX2Vuc19zc3A1ODVfUzMsIDE6MjApCmNTb2lsX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChjU29pbF9lbnNfc3NwNTg1X1MzLCAxOjIwKQpjVmVnX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChjVmVnX2Vuc19zc3A1ODVfUzMsIDE6MjApCgpyaF9sbmRfc3VtX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChyaF9sbmRfc3VtX2Vuc19zc3A1ODVfUzMsIDE6MjApCmZMdWNfbG5kX3N1bV9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoZkx1Y19sbmRfc3VtX2Vuc19zc3A1ODVfUzMsIDE6MjApCmxhaV9sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgobGFpX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIDE6MjApIAoKZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoZkhhcnZlc3RfbG5kX3N1bV9lbnNfc3NwNTg1X1MzLCAxOjIwKQp0cmVlRnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgodHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgMToyMCkKc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgMToyMCkKYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgMToyMCkKYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChjM1BmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgMToyMCkKYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyA8LSBhbm9tYWxpemVUU21hdHJpeChjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgMToyMCkKCiN0b3RhbF9sYW5kX2NhcmJvbl9hbm9tIDwtIGFub21hbGl6ZVRTbWF0cml4KHRvdGFsX2xhbmRfY2FyYm9uX2VucywgMToyMCkKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKdHJhbnNwdmFsIDwtIDMwCmxpbmVjb2wgPSAnYmxhY2snCgpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwxKSkKCm1hdHBsb3Qoc3NweWVhcnMsIHQobnBwX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnTlBQJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQobmJwX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnTkJQJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQoY1NvaWxfZW5zX3NzcDU4NV9TMyksIAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnY1NvaWwnLCB4bGFiID0gJycsIHlsYWIgPSAnR3RDJykKIAptYXRwbG90KHNzcHllYXJzLHQoY1ZlZ19lbnNfc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwgCiAgICAgICAgbWFpbiA9ICdjVmVnJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycgKQoKbWF0cGxvdChzc3B5ZWFycyx0KHJoX2xuZF9zdW1fZW5zX3NzcDU4NV9TMyApLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnUkgnLCB4bGFiID0gJycsIHlsYWIgPSAnR3RDJykKCm1hdHBsb3Qoc3NweWVhcnMsdChmTHVjX2xuZF9zdW1fZW5zX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdmTHVjJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQobGFpX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnTEFJJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQoZkhhcnZlc3RfbG5kX3N1bV9lbnNfc3NwNTg1X1MzKSwgCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdmSGFydmVzdCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAndHJlZUZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMpLCAKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ3NocnViRnJhYycsIHhsYWIgPSAnJywgeWxhYiA9ICclJykKCm1hdHBsb3Qoc3NweWVhcnMsdChiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdiYXJlc29pbEZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMpLCB0eXBlID0gJ2wnLCAKICAgICAgICBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ2MzUGZ0RnJhYycsIHhsYWIgPSAnJywgeWxhYiA9ICclJykKCm1hdHBsb3Qoc3NweWVhcnMsdChjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdjNFBmdEZyYWMnLCB4bGFiID0gJycseWxhYiA9ICclJykKCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCnRyYW5zcHZhbCA8LSAzMApsaW5lY29sID0gJ2JsYWNrJwoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgptYXRwbG90KHNzcHllYXJzLCB0KG5wcF9lbnNfYW5vbV9zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnTlBQJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQobmJwX2Vuc19hbm9tX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdOQlAnLCB4bGFiID0gJycsIHlsYWIgPSAnR3RDJykKCm1hdHBsb3Qoc3NweWVhcnMsdChjU29pbF9lbnNfYW5vbV9zc3A1ODVfUzMpLCAKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ2NTb2lsJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCiAKbWF0cGxvdChzc3B5ZWFycyx0KGNWZWdfZW5zX2Fub21fc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwgCiAgICAgICAgbWFpbiA9ICdjVmVnJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycgKQoKbWF0cGxvdChzc3B5ZWFycyx0KHJoX2xuZF9zdW1fZW5zX2Fub21fc3NwNTg1X1MzICksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdSSCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGZMdWNfbG5kX3N1bV9lbnNfYW5vbV9zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnZkx1YycsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGxhaV9sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnTEFJJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQoZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV9zc3A1ODVfUzMpLCAKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ2ZIYXJ2ZXN0JywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQodHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ3RyZWVGcmFjJywgeGxhYiA9ICcnLCB5bGFiID0gJyUnKQoKbWF0cGxvdChzc3B5ZWFycyx0KHNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMpLCAKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ3NocnViRnJhYycsIHhsYWIgPSAnJywgeWxhYiA9ICclJykKCm1hdHBsb3Qoc3NweWVhcnMsdChiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ2JhcmVzb2lsRnJhYycsIHhsYWIgPSAnJywgeWxhYiA9ICclJykKCm1hdHBsb3Qoc3NweWVhcnMsdChjM1BmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzKSwgdHlwZSA9ICdsJywgCiAgICAgICAgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdjM1BmdEZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdjNFBmdEZyYWMnLCB4bGFiID0gJycseWxhYiA9ICclJykKCgpgYGAKCgojIyBXaGljaCBlbnNlbWJsZSBtZW1iZXJzIG1hdGNoIGNvbnN0cmFpbnRzPwoKU3RhcnQgd2l0aCBMZXZlbCAyIChBbmR5J3MgY29uc3RyYWludHMgaW4gTlBQLCBOQlAsIGNTb2lsIGFuZCBjVmVnKQoKYGBge3J9CgppeF9tdiA8LSB3aGljaChzc3B5ZWFycyAlaW4lIDE5OTY6MjAxNSkKCnl2ZWNfY29uc3RyYWludHMgPC0gYygnbnBwX2Vuc19zc3A1ODVfUzMnLCAnbmJwX2Vuc19zc3A1ODVfUzMnLCAnY1NvaWxfZW5zX3NzcDU4NV9TMycsICdjVmVnX2Vuc19zc3A1ODVfUzMnKQoKIyBNYXRyaXggb2YgY29uc3RyYWludCBvdXRwdXQgbW9kZXJuIHZhbHVlcyAoMTk5NiAtIDIwMTUpCllfY29uc3Rfc3NwNTg1X212IDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBucm93KG5wcF9lbnNfc3NwNTg1X1MzKSwgbmNvbCA9IGxlbmd0aCh5dmVjX2NvbnN0cmFpbnRzKSkKY29sbmFtZXMoWV9jb25zdF9zc3A1ODVfbXYpIDwtIHl2ZWNfY29uc3RyYWludHMKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfY29uc3RyYWludHMpKXsKICAKICBZX3RydW5jIDwtIGdldCh5dmVjX2NvbnN0cmFpbnRzW2ldKVssIGl4X212XQogIFlfdHJ1bmNfbWVhbiA8LSBhcHBseShZX3RydW5jLCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgWV9jb25zdF9zc3A1ODVfbXZbLGldIDwtIFlfdHJ1bmNfbWVhbgp9CgpgYGAKCgpgYGB7cn0KCmNyZWF0ZUNvbnN0cmFpbnRTdHJpbmcgPC0gZnVuY3Rpb24oeXZlYywgbWlucywgbWF4ZXMpewogICMgVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbG9naWNhbCBleHByZXNzaW9uIGFzIGEgc3RyaW5nIHRvIGJlIGV2YWx1YXRlZAogIG91dCA8LSAnd2hpY2goJwogIAogIGZvcihpIGluIDE6bGVuZ3RoKHl2ZWMpKXsKICAgIAogICAgaWYoaTxsZW5ndGgoeXZlYykpewogICAgICAKICAgIHN1YmNvbnN0IDwtIHBhc3RlMCgnWV91bmlmJywnWywnLCAnIicseXZlY1tpXSwnIicsJ10nLCAnPicsIG1pbnNbaV0sICcmJywgJ1lfdW5pZicsJ1ssJywgJyInLHl2ZWNbaV0sICciJywnXScgLCAnPCcsIG1heGVzW2ldLCAnJicpCiAgICB9CiAgICAKICAgIGVsc2V7CiAgICAgc3ViY29uc3QgPC0gIHBhc3RlMCgnWV91bmlmJywnWywnLCAnIicseXZlY1tpXSwnIicsJ10nLCAnPicsIG1pbnNbaV0sICcmJywgJ1lfdW5pZicsJ1ssJywgJyInLHl2ZWNbaV0sICciJywnXScgLCAnPCcsIG1heGVzW2ldKQogICAgfQogICBvdXQgPC0gIHBhc3RlMChvdXQsIHN1YmNvbnN0KQogIH0KICAKICBvdXQgPC0gcGFzdGUwKG91dCwgJyknKQp9CgoKQVdfbWlucyA8LSBjKDM1LCAwLCA3NTAsIDMwMCkKQVdfbWF4ZXMgPC0gYyg4MCwgMTAwMDAsIDMwMDAsIDgwMCkKCllfdW5pZiA8LSBZX2NvbnN0X3NzcDU4NV9tdgppeF9rZXB0X0FXIDwtIGV2YWwocGFyc2UodGV4dCA9IGNyZWF0ZUNvbnN0cmFpbnRTdHJpbmcoeXZlYz15dmVjX2NvbnN0cmFpbnRzLCBtaW5zID0gQVdfbWlucywgbWF4ZXMgPSBBV19tYXhlcykpKQoKCgojZXZhbChwYXJzZSh0ZXh0ID0gcGFzdGUwKCkpKQoKaW5wdXRDb25zdHJhaW50U2l6ZSA8LSBmdW5jdGlvbihZX3VuaWYsIHl2ZWMsIG1pbnMsIG1heGVzKXsKICAjIENhbGN1bGF0ZSB0aGUgaW5kaWNlcyBvZiBZX3VuaWYgdGhhdCBhcmUgd2l0aGluIHRoZSBib3VuZHMgc2V0IGJ5IG1pbnMgYW5kIG1heGVzCiAgCiAgCiAgaXhfa2VwdCA8LSBldmFsKHBhcnNlKHRleHQgPSBjcmVhdGVDb25zdHJhaW50U3RyaW5nKHl2ZWM9eXZlYywgbWlucyA9IG1pbnMsIG1heGVzID0gbWF4ZXMpKSkKICAKICBwcm9wX2tlcHQgPC0gbGVuZ3RoKGl4X2tlcHQpIC8gbnJvdyhZX3VuaWYpCiAgCiAgcmV0dXJuKGxpc3QoaXhfa2VwdCA9IGl4X2tlcHQsIHByb3Bfa2VwdCA9IHByb3Bfa2VwdCkpCiAgCn0KICAKYGBgCgojIyMgVGltZXNlcmllcyBvZiBhYnNvbHV0ZSB2YWxlcwoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9Cmxjb2xfd2F2ZTAxIDwtIG1ha2VUcmFuc3BhcmVudCgnZmlyZWJyaWNrJywgIDgwKQpsY29sX3dhdmUwMV9sZXZlbDIgPC0gbWFrZVRyYW5zcGFyZW50KCdnb2xkJywgIDgwKQpzdGFuY29sID0gJ2JsYWNrJwoKbGluZVBsb3RNdWx0aUVucyA8LSBmdW5jdGlvbih5ZWFycywgZW5zMSwgZW5zMiwgY29sMSwgY29sMiwgeWxhYiwgbWFpbiwgeWxpbSA9IE5VTEwpewogICMgUGxvdCB3YXZlMDAgYW5kIHdhdmUwMSB0aW1lc2VyaWVzIG9uIHRvcCBvZiBvbmUgYW5vdGhlcgogIAogIG50IDwtIGxlbmd0aCh5ZWFycykgCiAgaWYoaXMubnVsbCh5bGltKSl7CiAgICAKICAjeWxpbSA9IHJhbmdlKGMoZW5zMVssMV0sIGVuczFbLG50XSwgZW5zMlssMV0sIGVuczJbICxudF0pKQogIHlsaW0gPSByYW5nZShjKGVuczEsZW5zMikpCiAgfQogIAogIGVsc2UgeWxpbSA8LSB5bGltCiAgCiAgbWF0cGxvdCh5ZWFycywgdChlbnMxKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gY29sMSwKICAgICAgICB5bGFiID0geWxhYiwgbWFpbiA9IG1haW4sIHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicsIGx3ZCA9IDEuNSkKICBtYXRsaW5lcyh5ZWFycywgdChlbnMyKSwgY29sID0gY29sMiwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMS41KQp9CmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHNzcHllYXJzLCBlbnMxID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKSwKICAgICAgICAgICAgICAgICBlbnMyID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKVtpeF9rZXB0X0FXLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwMSwgY29sMiA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gc2VsZWN0X3VuaXRzW2ldLCBtYWluID0geXZlY19zc3A1ODVbaV0pCiAgICAgICAgICAgICAgICAgCn0KCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAnd2F2ZTAxIGxldmVsMicpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyLCBjb2wgPSBjKGxjb2xfd2F2ZTAxLCBsY29sX3dhdmUwMV9sZXZlbDIpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKCgpgYGAKCgojIyMgQW5vbWFseSB0aW1lc2VyaWVzCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCnBhcihtZnJvdz0gYygzLDUpLCBsYXMgPSAxLCBtYXIgPSBjKDQsNCwxLDEpKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19zc3A1ODUpKXsKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSBzc3B5ZWFycywgZW5zMSA9IGdldCh5dmVjX2Fub21fc3NwNTg1W2ldKSwKICAgICAgICAgICAgICAgICBlbnMyID0gZ2V0KHl2ZWNfYW5vbV9zc3A1ODVbaV0pW2l4X2tlcHRfQVcsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAxLCBjb2wyID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIG1haW4gPSB5dmVjX3NzcDU4NVtpXSkKICAgICAgICAgICAgICAgICAKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICd3YXZlMDEgbGV2ZWwyJyksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIsIGNvbCA9IGMobGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMiksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgpgYGAKCgojIyBJbmNsdWRlIGJhcmVzb2lsIGZyYWN0aW9uIGRhdGEKCmBgYHtyfQoKbG9hZCgndHJlZWZyYWMvZ2xvYmFsX2ZyYWNfY2NpLlJEYXRhJykKCmZyYWNfY2NpIDwtIGMoZ2xvYmFsX2ZyYWNfY2NpWzFdICsgZ2xvYmFsX2ZyYWNfY2NpWzJdLCBnbG9iYWxfZnJhY19jY2lbM10sIGdsb2JhbF9mcmFjX2NjaVs0XSwgZ2xvYmFsX2ZyYWNfY2NpWzVdLCBnbG9iYWxfZnJhY19jY2lbOF0gKQojZnJhY19tdiA8LSBjKHN0YW5kYXJkX21vZGVybl92YWx1ZVsndHJlZUZyYWNfbG5kX21lYW4nXSwgc3RhbmRhcmRfbW9kZXJuX3ZhbHVlWydjM1BmdEZyYWNfbG5kX21lYW4nXSwgI3N0YW5kYXJkX21vZGVybl92YWx1ZVsnYzRQZnRGcmFjX2xuZF9tZWFuJ10sIHN0YW5kYXJkX21vZGVybl92YWx1ZVsnc2hydWJGcmFjX2xuZF9tZWFuJ10sIHN0YW5kYXJkX21vZGVybl92YWx1ZVsnYmFyZXNvaWxGcmFjX2xuZF9tZWFuJ10gICkKCgpmcmFjbGFiID0gYygnVHJlZXMnLCAnQzMgZ3Jhc3NlcycsICdDNCBncmFzc2VzJywgJ1NocnVicycsICdCYXJlIHNvaWwnKQoKCiMgSGFsZiBhbmQgZG91YmxlIHRoZSBMQyBDQ0kgZGF0YSB0byBnZXQgYm91bmRzIGZvciBjb25zdHJhaW5pbmcgSlVMRVMgRVMtMS4wCmZyYWNfY2NpX21heCA8LSBmcmFjX2NjaSArICgwLjUqZnJhY19jY2kpCmZyYWNfY2NpX21pbiA8LSBmcmFjX2NjaSAtICgwLjUqZnJhY19jY2kpCgpgYGAKCgpgYGB7cn0KCiMgTW9kZXJuIHZhbHVlIAppeF9tdiA8LSB3aGljaChzc3B5ZWFycyAlaW4lIDE5OTY6MjAxNSkKCnl2ZWNfY29uc3RyYWludHMgPC0gYygnbnBwX2Vuc19zc3A1ODVfUzMnLCAnbmJwX2Vuc19zc3A1ODVfUzMnLCAnY1NvaWxfZW5zX3NzcDU4NV9TMycsICdjVmVnX2Vuc19zc3A1ODVfUzMnLCdiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMycpCgojIE1hdHJpeCBvZiBjb25zdHJhaW50IG91dHB1dCBtb2Rlcm4gdmFsdWVzICgxOTk2IC0gMjAxNSkKWV9jb25zdF9zc3A1ODVfbXYgPC0gbWF0cml4KGRhdGEgPSBOQSwgbnJvdyA9IG5yb3cobnBwX2Vuc19zc3A1ODVfUzMpLCBuY29sID0gbGVuZ3RoKHl2ZWNfY29uc3RyYWludHMpKQpjb2xuYW1lcyhZX2NvbnN0X3NzcDU4NV9tdikgPC0geXZlY19jb25zdHJhaW50cwoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19jb25zdHJhaW50cykpewogIAogIFlfdHJ1bmMgPC0gZ2V0KHl2ZWNfY29uc3RyYWludHNbaV0pWywgaXhfbXZdCiAgWV90cnVuY19tZWFuIDwtIGFwcGx5KFlfdHJ1bmMsIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkKICBZX2NvbnN0X3NzcDU4NV9tdlssaV0gPC0gWV90cnVuY19tZWFuCn0KCmBgYAoKYGBge3J9CmNvbnN0X21pbnMgPC0gYygzNSwgMCwgNzUwLCAzMDAsIGZyYWNfY2NpX21pblsnYmFyZSBzb2lsJ10qMTAwKQpjb25zdF9tYXhlcyA8LSBjKDgwLCAxMDAwMCwgMzAwMCwgODAwLCBmcmFjX2NjaV9tYXhbJ2JhcmUgc29pbCddKjEwMCkKCllfdW5pZiA8LSBZX2NvbnN0X3NzcDU4NV9tdgppeF9rZXB0X0FXQlMgPC0gZXZhbChwYXJzZSh0ZXh0ID0gY3JlYXRlQ29uc3RyYWludFN0cmluZyh5dmVjPXl2ZWNfY29uc3RyYWludHMsIG1pbnMgPSBjb25zdF9taW5zLCBtYXhlcyA9IGNvbnN0X21heGVzKSkpCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KbGNvbF93YXZlMDEgPC0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJywgIDEyMCkKbGNvbF93YXZlMDFfbGV2ZWwyIDwtIG1ha2VUcmFuc3BhcmVudCgnZ29sZCcsICAxMjApCmxjb2xfd2F2ZTAxX2xldmVsMzwtIG1ha2VUcmFuc3BhcmVudCgnY2FkZXRibHVlJywgIDIwMCkKc3RhbmNvbCA9ICdibGFjaycKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEyfQoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHNzcHllYXJzLCBlbnMxID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKSwKICAgICAgICAgICAgICAgICBlbnMyID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKVtpeF9rZXB0X0FXQlMsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAxLCBjb2wyID0gbGNvbF93YXZlMDFfbGV2ZWwzLAogICAgICAgICAgICAgICAgIHlsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIG1haW4gPSB5dmVjX3NzcDU4NVtpXSkKICAgICAgICAgICAgICAgICAKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICd3YXZlMDEgbGV2ZWwzJyksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIsIGNvbCA9IGMobGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMyksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCmBgYAojIyMgQW5vbWFseSB0aW1lc2VyaWVzIEFXICsgYmFyZXNvaWwKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwxKSkKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfc3NwNTg1KSl7CgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0gc3NweWVhcnMsIGVuczEgPSBnZXQoeXZlY19hbm9tX3NzcDU4NVtpXSksCiAgICAgICAgICAgICAgICAgZW5zMiA9IGdldCh5dmVjX2Fub21fc3NwNTg1W2ldKVtpeF9rZXB0X0FXQlMsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAxLCBjb2wyID0gbGNvbF93YXZlMDFfbGV2ZWwzLAogICAgICAgICAgICAgICAgIHlsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIG1haW4gPSB5X25hbWVzX3NlbGVjdF9zc3A1ODVbaV0pCiAgICAgICAgICAgICAgICAgCn0KCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAnd2F2ZTAxIGxldmVsMycpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyLCBjb2wgPSBjKGxjb2xfd2F2ZTAxLCBsY29sX3dhdmUwMV9sZXZlbDMpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQpgYGAKIyMgRW5kLU9mLUNlbnR1cnkgdmFsdWVzIHVuZGVyIHZhcmlvdXMgY29uc3RyYWludHMKClN0YXJ0aW5nIHdpdGggQVcgY29uc3RyYWludHMgKGxldmVsIDIpIGFuZCB0aGVuIGJhcmUgc29pbCAobGV2ZWwzKQoKYGBge3J9CgojRW5kIG9mIENlbnR1cnkKaXhfZW9jIDwtIHdoaWNoKHNzcHllYXJzICVpbiUgMjA4MToyMTAwKQpZX3NzcDU4NV9lb2MgPC0gbWF0cml4KGRhdGEgPSBOQSwgbnJvdyA9IG5yb3cobnBwX2Vuc19zc3A1ODVfUzMpLCBuY29sID0gbGVuZ3RoKHl2ZWNfc3NwNTg1KSkKY29sbmFtZXMoWV9zc3A1ODVfZW9jKSA8LSB5dmVjX3NzcDU4NQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19zc3A1ODUpKXsKICAKICBZX3RydW5jIDwtIGdldCh5dmVjX3NzcDU4NVtpXSlbLCBpeF9lb2NdCiAgWV90cnVuY19tZWFuIDwtIGFwcGx5KFlfdHJ1bmMsIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkKICBZX3NzcDU4NV9lb2NbLGldIDwtIFlfdHJ1bmNfbWVhbgp9CmBgYAoKIyMjIEhpc3RvZ3JhbXMgb2YgZW5kLW9mLWNlbnR1cnkgYWJzb2x1dGUgdmFsdWVzCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKCmhjb2xfd2F2ZTAxIDwtIG1ha2VUcmFuc3BhcmVudCgnZmlyZWJyaWNrJywgMTUwKQpoY29sX3dhdmUwMV9sZXZlbDIgPC0gbWFrZVRyYW5zcGFyZW50KCdnb2xkJywyNTUpCmhjb2xfd2F2ZTAxX2xldmVsMyA8LSBtYWtlVHJhbnNwYXJlbnQoJ2NhZGV0Ymx1ZScsMjU1KQoKCnBhcihtZnJvdyA9IGMoMyw1KSwgZmcgPSAnZ3JleScpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewogIAogIGgxIDwtIGhpc3QoWV9zc3A1ODVfZW9jWyxpXSwgbWFpbiA9IHlfbmFtZXNfc2VsZWN0X3NzcDU4NVtpXSwgeGxhYiA9IHNlbGVjdF91bml0c1tpXSwgY29sID0gaGNvbF93YXZlMDEsIHlsaW0gPSBjKDAsMjI1KSkKICAKICBoaXN0KFlfc3NwNTg1X2VvY1tpeF9rZXB0X0FXLGldLCBjb2wgPSBoY29sX3dhdmUwMV9sZXZlbDIsIGFkZCA9IFRSVUUsIGJyZWFrcyA9IGgxJGJyZWFrcykKICBoaXN0KFlfc3NwNTg1X2VvY1tpeF9rZXB0X0FXQlMsaV0sIGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMywgYWRkID0gVFJVRSwgYnJlYWtzID0gaDEkYnJlYWtzKQp9CgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgICd3YXZlMDEgbGV2ZWwyJywgJ3dhdmUwMSBsZXZlbDMnKSwgIGZpbGw9IGMoaGNvbF93YXZlMDEsaGNvbF93YXZlMDFfbGV2ZWwyLCBoY29sX3dhdmUwMV9sZXZlbDMpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKcGFyKG1mcm93ID0gYygzLDUpLCBmZyA9ICdncmV5JykKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfc3NwNTg1KSl7CiAgCiAgaDEgPC0gaGlzdChZX3NzcDU4NV9lb2NbaXhfa2VwdF9BVyxpXSwgbWFpbiA9IHlfbmFtZXNfc2VsZWN0X3NzcDU4NVtpXSwgeGxhYiA9IHNlbGVjdF91bml0c1tpXSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwyLCB5bGltID0gYygwLDgwKSkKICBoaXN0KFlfc3NwNTg1X2VvY1tpeF9rZXB0X0FXQlMsaV0sIGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMywgYWRkID0gVFJVRSwgYnJlYWtzID0gaDEkYnJlYWtzKQp9CgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYyggJ3dhdmUwMSBsZXZlbDInLCAnd2F2ZTAxIGxldmVsMycpLCAgZmlsbD0gYyhoY29sX3dhdmUwMV9sZXZlbDIsIGhjb2xfd2F2ZTAxX2xldmVsMyksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgoKYGBgCgojIyMgSGlzdG9ncmFtcyBvZiBlbmQtb2YtY2VudHVyeSBjaGFuZ2VzIChhbm9tYWx5IGZyb20gcHJlaW5kdXN0cmlhbCkKCmBgYHtyfQoKI0VuZCBvZiBDZW50dXJ5Cml4X2VvYyA8LSB3aGljaChzc3B5ZWFycyAlaW4lIDIwODE6MjEwMCkKWV9zc3A1ODVfYW5vbV9lb2MgPC0gbWF0cml4KGRhdGEgPSBOQSwgbnJvdyA9IG5yb3cobnBwX2Vuc19hbm9tX3NzcDU4NV9TMyksIG5jb2wgPSBsZW5ndGgoeXZlY19zc3A1ODUpKQpjb2xuYW1lcyhZX3NzcDU4NV9hbm9tX2VvYykgPC0geXZlY19hbm9tX3NzcDU4NQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19hbm9tX3NzcDU4NSkpewogIAogIFlfdHJ1bmMgPC0gZ2V0KHl2ZWNfYW5vbV9zc3A1ODVbaV0pWywgaXhfZW9jXQogIFlfdHJ1bmNfbWVhbiA8LSBhcHBseShZX3RydW5jLCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgWV9zc3A1ODVfYW5vbV9lb2NbLGldIDwtIFlfdHJ1bmNfbWVhbgp9CmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KCgojaGNvbF93YXZlMDEgPC0gbWFrZVRyYW5zcGFyZW50KCdmaXJlYnJpY2snLCAxNTApCiNoY29sX3dhdmUwMV9sZXZlbDIgPC0gbWFrZVRyYW5zcGFyZW50KCdnb2xkJywyNTUpCiNoY29sX3dhdmUwMV9sZXZlbDMgPC0gbWFrZVRyYW5zcGFyZW50KCdjYWRldGJsdWUnLDI1NSkKCnBhcihtZnJvdyA9IGMoMyw1KSwgZmcgPSAnZ3JleScpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX2Fub21fc3NwNTg1KSl7CiAgCiAgaDEgPC0gaGlzdChZX3NzcDU4NV9hbm9tX2VvY1ssaV0sIG1haW4gPSB5X25hbWVzX3NlbGVjdF9zc3A1ODVbaV0sIHhsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIGNvbCA9IGhjb2xfd2F2ZTAxLCB5bGltID0gYygwLDIyNSkpCiAgCiAgaGlzdChZX3NzcDU4NV9hbm9tX2VvY1tpeF9rZXB0X0FXLGldLCBjb2wgPSBoY29sX3dhdmUwMV9sZXZlbDIsIGFkZCA9IFRSVUUsIGJyZWFrcyA9IGgxJGJyZWFrcykKICBoaXN0KFlfc3NwNTg1X2Fub21fZW9jW2l4X2tlcHRfQVdCUyxpXSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwzLCBhZGQgPSBUUlVFLCBicmVha3MgPSBoMSRicmVha3MpCiAgCiAgYWJsaW5lKHYgPSAwKQp9CgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgICd3YXZlMDEgbGV2ZWwyJywgJ3dhdmUwMSBsZXZlbDMnKSwgIGZpbGw9IGMoaGNvbF93YXZlMDEsaGNvbF93YXZlMDFfbGV2ZWwyLCBoY29sX3dhdmUwMV9sZXZlbDMpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKYGBgCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgoKI2hjb2xfd2F2ZTAxIDwtIG1ha2VUcmFuc3BhcmVudCgnZmlyZWJyaWNrJywgMTUwKQojaGNvbF93YXZlMDFfbGV2ZWwyIDwtIG1ha2VUcmFuc3BhcmVudCgnZ29sZCcsMjU1KQojaGNvbF93YXZlMDFfbGV2ZWwzIDwtIG1ha2VUcmFuc3BhcmVudCgnY2FkZXRibHVlJywyNTUpCgpwYXIobWZyb3cgPSBjKDMsNSksIGZnID0gJ2dyZXknKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19hbm9tX3NzcDU4NSkpewogIAogaDEgPC0gIGhpc3QoWV9zc3A1ODVfYW5vbV9lb2NbaXhfa2VwdF9BVyxpXSwgIG1haW4gPSB5X25hbWVzX3NlbGVjdF9zc3A1ODVbaV0sIHhsYWIgPSBzZWxlY3RfdW5pdHNbaV0sY29sID0gaGNvbF93YXZlMDFfbGV2ZWwyLCB5bGltID0gYygwLDgwKSkKICBoaXN0KFlfc3NwNTg1X2Fub21fZW9jW2l4X2tlcHRfQVdCUyxpXSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwzLCBhZGQgPSBUUlVFLCBicmVha3MgPSBoMSRicmVha3MpCiAgCiAgYWJsaW5lKHYgPSAwKQp9CgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAxIGxldmVsMicsICd3YXZlMDEgbGV2ZWwzJyksICBmaWxsPSBjKGhjb2xfd2F2ZTAxX2xldmVsMiwgaGNvbF93YXZlMDFfbGV2ZWwzKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKCmBgYAoKIyMgQWRkaW5nIGN1bXVsYXRpdmUgTkJQIGFzIGEgY29uc3RyYWludAoKYGBge3J9CnRlc3QgPC0gbWF0cml4KDE6OSwgbnJvdyA9IDMsIGJ5cm93ID0gVFJVRSkKdGVzdAoKdChhcHBseSh0ZXN0LCAxLCBGVU4gPSBjdW1zdW0pKQpgYGAKCmBgYHtyfQoKY25icF9lbnNfc3NwNTg1X1MzIDwtICB0KGFwcGx5KG5icF9lbnNfc3NwNTg1X1MzLCAxLCBGVU4gPSBjdW1zdW0pKQoKYGBgCgoKYGBge3J9CgojIE1vZGVybiB2YWx1ZSAKIyBpeF9tdiA8LSB3aGljaChzc3B5ZWFycyAlaW4lIDE5OTY6MjAxNSkKIyAKIyB5dmVjX2NvbnN0cmFpbnRzIDwtIGMoJ25wcF9lbnNfc3NwNTg1X1MzJywgJ25icF9lbnNfc3NwNTg1X1MzJywgJ2NTb2lsX2Vuc19zc3A1ODVfUzMnLCAnY1ZlZ19lbnNfc3NwNTg1X1MzJywnYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMnKQojIAojICMgTWF0cml4IG9mIGNvbnN0cmFpbnQgb3V0cHV0IG1vZGVybiB2YWx1ZXMgKDE5OTYgLSAyMDE1KQojIFlfY29uc3Rfc3NwNTg1X212IDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBucm93KG5wcF9lbnNfc3NwNTg1X1MzKSwgbmNvbCA9IGxlbmd0aCh5dmVjX2NvbnN0cmFpbnRzKSkKIyBjb2xuYW1lcyhZX2NvbnN0X3NzcDU4NV9tdikgPC0geXZlY19jb25zdHJhaW50cwojIAojIGZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfY29uc3RyYWludHMpKXsKIyAgIAojICAgWV90cnVuYyA8LSBnZXQoeXZlY19jb25zdHJhaW50c1tpXSlbLCBpeF9tdl0KIyAgIFlfdHJ1bmNfbWVhbiA8LSBhcHBseShZX3RydW5jLCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiMgICBZX2NvbnN0X3NzcDU4NV9tdlssaV0gPC0gWV90cnVuY19tZWFuCiMgfQoKYGBgCgoKYGBge3J9CiMgQ2FsY3VsYXRlIE1vZGVybiB2YWx1ZSBDTkJQCgppeF8yMDE0IDwtIHdoaWNoKHNzcHllYXJzID09IDIwMTQpCgpjbmJwX2Vuc19zc3A1ODVfUzNfbXYgPC0gY25icF9lbnNfc3NwNTg1X1MzWywgaXhfMjAxNF0KCmJyZWFrcyA8LSBzZXEoZnJvbSA9IC0xMDAsIHRvID0gMzUwLCBieSA9IDI1KQpoaXN0KGNuYnBfZW5zX3NzcDU4NV9TM19tdiwgbWFpbiA9ICJjdW11bGF0aXZlIE5CUCBzaW5jZSAxODUwIGF0IDIwMTQiLCBjb2wgPSBoY29sX3dhdmUwMSwKICAgICB4bGFiID0gJ0N1bXVsYXRpdmUgTkJQIHNpbmNlIDE4NTAgKEd0QyknLCBicmVha3MgPSBicmVha3MpCmhpc3QoY25icF9lbnNfc3NwNTg1X1MzX212W2l4X2tlcHRfQVddLCBhZGQgPSBUUlVFLCBjb2wgPSBoY29sX3dhdmUwMV9sZXZlbDIsIGJyZWFrcyA9IGJyZWFrcykKaGlzdChjbmJwX2Vuc19zc3A1ODVfUzNfbXZbaXhfa2VwdF9BV0JTXSwgYWRkID0gVFJVRSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwzLCBicmVha3MgPSBicmVha3MpCiAgICAgCnJlc2V0KCkKCmxlZ2VuZCgndG9wcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAgJ3dhdmUwMSBsZXZlbDInLCAnd2F2ZTAxIGxldmVsMycpLCAgZmlsbD0gYyhoY29sX3dhdmUwMSxoY29sX3dhdmUwMV9sZXZlbDIsIGhjb2xfd2F2ZTAxX2xldmVsMyksIGluc2V0ID0gYygwLjIsIDAuMikgKQoKYGBgCgoKYGBge3J9CmNvbnN0X21pbnMgPC0gYygzNSwgMCwgNzUwLCAzMDAsIGZyYWNfY2NpX21pblsnYmFyZSBzb2lsJ10qMTAwKQpjb25zdF9tYXhlcyA8LSBjKDgwLCAxMDAwMCwgMzAwMCwgODAwLCBmcmFjX2NjaV9tYXhbJ2JhcmUgc29pbCddKjEwMCkKCllfdW5pZiA8LSBZX2NvbnN0X3NzcDU4NV9tdgppeF9rZXB0X0FXQlMgPC0gZXZhbChwYXJzZSh0ZXh0ID0gY3JlYXRlQ29uc3RyYWludFN0cmluZyh5dmVjPXl2ZWNfY29uc3RyYWludHMsIG1pbnMgPSBjb25zdF9taW5zLCBtYXhlcyA9IGNvbnN0X21heGVzKSkpCgpgYGAKCgpgYGB7cn0KCmNvbnN0X21pbnNfbGV2ZWw0IDwtIGMoMzUsIDAsIDc1MCwgMzAwLCBmcmFjX2NjaV9taW5bJ2JhcmUgc29pbCddKjEwMCwgLTQwKQpjb25zdF9tYXhlc19sZXZlbDQgPC0gYyg4MCwgMTAwMDAsIDMwMDAsIDgwMCwgZnJhY19jY2lfbWF4WydiYXJlIHNvaWwnXSoxMDAsIDQwKQoKWV91bmlmIDwtIGNiaW5kKFlfY29uc3Rfc3NwNTg1X212LCBjbmJwX2Vuc19zc3A1ODVfUzNfbXYpCmxldmVsNF9jb25zdHJhaW50cyA8LSBjKCducHBfZW5zX3NzcDU4NV9TMycsICduYnBfZW5zX3NzcDU4NV9TMycsICdjU29pbF9lbnNfc3NwNTg1X1MzJywgJ2NWZWdfZW5zX3NzcDU4NV9TMycsICdiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMycsICdjbmJwX2Vuc19zc3A1ODVfUzNfbXYnKQppeF9rZXB0X2xldmVsNCA8LSBldmFsKHBhcnNlKHRleHQgPSBjcmVhdGVDb25zdHJhaW50U3RyaW5nKHl2ZWM9bGV2ZWw0X2NvbnN0cmFpbnRzLCBtaW5zID0gY29uc3RfbWluc19sZXZlbDQsIG1heGVzID0gY29uc3RfbWF4ZXNfbGV2ZWw0KSkpCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDEwfQoKbWF0cGxvdChzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDEsIDEwMCksCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ0N1bXVsYXRpdmUgTkJQJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJywgbHdkID0gMikKCm1hdGxpbmVzKHNzcHllYXJzLCB0KGNuYnBfZW5zX3NzcDU4NV9TM1tpeF9rZXB0X0FXLCBdKSwgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGhjb2xfd2F2ZTAxX2xldmVsMiwgMjAwKSwgbHdkID0gMikKbWF0bGluZXMoc3NweWVhcnMsIHQoY25icF9lbnNfc3NwNTg1X1MzW2l4X2tlcHRfQVdCUywgXSksbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGhjb2xfd2F2ZTAxX2xldmVsMywgMjAwKSwgbHdkID0gMikKbWF0bGluZXMoc3NweWVhcnMsIHQoY25icF9lbnNfc3NwNTg1X1MzW2l4X2tlcHRfbGV2ZWw0LCBdKSxsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgMjAwKSwgbHdkID0gMikKCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tbGVmdCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICAnd2F2ZTAxIGxldmVsMicsICd3YXZlMDEgbGV2ZWwzJywgJ3dhdmUwMSBsZXZlbDQnKSwgIGNvbCA9IGMoaGNvbF93YXZlMDEsaGNvbF93YXZlMDFfbGV2ZWwyLCBoY29sX3dhdmUwMV9sZXZlbDMsICdibGFjaycpLCBpbnNldCA9IGMoMC4yLCAwLjIpLCBsdHkgPSAnc29saWQnICkKCmBgYAoKCmBgYHtyfQoobGVuZ3RoKGl4X2tlcHRfQVcpIC8gNTAwKSAqIDEwMAoobGVuZ3RoKGl4X2tlcHRfQVdCUykgLzUwMCkgKiAxMDAKKGxlbmd0aChpeF9rZXB0X2xldmVsNCkgLyA1MDApICogMTAwIApgYGAKCgoK